
package com.hjk.common.response.wrapper;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.hjk.common.response.enums.BaseREnum;
import com.hjk.common.utils.date.MyDateTimeUtils;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;


/**
 * 基本响应
 *
 * @author huangjunkai
 * @date 2020年11月20日10:55:12
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class R<T> implements Serializable {

    private static final long serialVersionUID = 4893280118017319089L;

    /**
     * 编号.
     */
    private int code;

    /**
     * 信息.
     */
    private String message;

    /**
     * 结果数据
     */
    private String date = MyDateTimeUtils.formatDefaultDate();

    /**
     * 结果数据
     */
    private T result;


    /**
     * 成功响应
     */
    public R() {
        this(BaseREnum.SUCCESS.getCode(), BaseREnum.SUCCESS.getMessage());
    }

    public R(int code, String message) {
        this(code, message, null);
    }

    public R(BaseREnum rEnum, T e) {
        this(rEnum.getCode(), rEnum.getMessage(), e);
    }

    public R(int code, String message, T result) {
        super();
        this.code(code).message(message).result(result);
    }

    /**
     * Sets the 编号 , 返回自身的引用.
     *
     * @param code the new 编号
     * @return the wrapper
     */
    private R<T> code(int code) {
        this.setCode(code);
        return this;
    }

    /**
     * Sets the 信息 , 返回自身的引用.
     *
     * @param message the new 信息
     * @return the R
     */
    private R<T> message(String message) {
        this.setMessage(message);
        return this;
    }

    /**
     * Sets the 结果数据 , 返回自身的引用.
     *
     * @param result the new 结果数据
     * @return the R
     */
    public R<T> result(T result) {
        this.setResult(result);
        return this;
    }

    /**
     * 判断是否成功： 依据 Wrapper.SUCCESS_CODE == this.code
     *
     * @return code =200,true;否则 false.
     */
    @JsonIgnore
    public boolean success() {
        return BaseREnum.SUCCESS.getCode() == this.code;
    }

    public static <E> R<E> ok(BaseREnum rEnum, E o) {
        return new R<>(rEnum, o);
    }

    /**
     * 500 错误
     */
    public static R error(String e) {
        return new R(BaseREnum.SYS_ERROR.getCode(), e);
    }

    /**
     * getResult
     *
     * @param <E>     the element type
     * @param wrapper the wrapper
     * @return the e
     */
    public static <E> E getResult(R<E> wrapper) {
        return wrapper.getResult();
    }

    public static <E> R<E> error(BaseREnum rEnum) {
        return new R<>(rEnum.getCode(), rEnum.getMessage());
    }

    public static <E> R<E> error(int code, String message) {
        return new R<>(code, message);
    }

    /**
     * Wrap SUCCESS. code=200
     *
     * @param <E> the element type
     * @return the wrapper
     */
    public static <E> R<E> ok() {
        return new R<>();
    }

    /**
     * Ok wrapper.
     *
     * @param <E> the type parameter
     * @param o   the o
     * @return the wrapper
     */
    public static <E> R<E> ok(E o) {
        return new R<>(BaseREnum.SUCCESS.getCode(), BaseREnum.SUCCESS.getMessage(), o);
    }

    public static void main(String[] args) {
        System.out.println(new R<>());
    }
}
